package com.william.git;

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.PullResult;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;

/**
 * Git仓库代码拉取工具类
 * 
 * @author wuyong
 * @date 2024/1/21
 */
public class GitPull {
    private static final Logger logger = LoggerFactory.getLogger(GitPull.class);

    /**
     * 拉取指定目录的Git仓库最新代码
     *
     * @param localPath Git仓库本地路径
     * @param username Git用户名（可选）
     * @param password Git密码（可选）
     * @return 是否拉取成功
     */
    public boolean pullLatestCode(String localPath, String username, String password) {
        if (localPath == null || localPath.trim().isEmpty()) {
            logger.error("本地仓库路径不能为空");
            return false;
        }

        File gitDir = new File(localPath);
        if (!gitDir.exists() || !new File(gitDir, ".git").exists()) {
            logger.error("指定路径不是有效的Git仓库：{}", localPath);
            return false;
        }

        try (Git git = Git.open(gitDir)) {
            // 配置凭证（如果提供）
            UsernamePasswordCredentialsProvider credentialsProvider = null;
            if (username != null && password != null) {
                credentialsProvider = new UsernamePasswordCredentialsProvider(username, password);
            }

            // 执行pull操作
            PullResult result = git.pull()
                    .setCredentialsProvider(credentialsProvider)
                    .call();

            if (result.isSuccessful()) {
                logger.info("成功拉取最新代码，仓库路径：{}", localPath);
                return true;
            } else {
                logger.error("拉取代码失败，仓库路径：{}", localPath);
                return false;
            }

        } catch (GitAPIException e) {
            logger.error("Git操作异常，仓库路径：{}，错误信息：{}", localPath, e.getMessage(), e);
            return false;
        } catch (IOException e) {
            logger.error("IO异常，仓库路径：{}，错误信息：{}", localPath, e.getMessage(), e);
            return false;
        }
    }

    /**
     * 拉取指定目录的Git仓库最新代码（无认证信息版本）
     *
     * @param localPath Git仓库本地路径
     * @return 是否拉取成功
     */
    public boolean pullLatestCode(String localPath) {
        return pullLatestCode(localPath, null, null);
    }
} 